package com.m1book.domain;

import com.m1book.domain.book.ABook;
import com.m1book.domain.book.Book;
import com.m1book.domain.user.Miser;

/**
 * 咪书网的主要服务功能。
 * @author Frankie
 *
 */
public interface M1BookService {
	
	/**
	 * 登记ABook
	 * @param miser 登记者
	 * @param abook 登记的一本实体书
	 * @return 系统分配给次ABook的咪书记录号。此号是由登记者昵称、日期、数字组成的。
	 */
	public String registerABook(Miser miser, ABook abook);
	
	/**
	 * 将登记的书状态变成捐赠状态。
	 * @param miser 捐赠者
	 * @param abook 捐赠的一本实体书
	 * @return 捐赠成功或失败。true：捐赠成功；false：捐赠失败。
	 * @throws AuthorizationExeption 授权失败异常，可能的原因是此书不是此用户登记的。
	 * @throws ABookStateException 本书状态异常。可能的原始是此书已经是捐赠状态了。
	 */
	public boolean donaABook(Miser miser, ABook abook) throws AuthorizationExeption, ABookStateException;
	
	/**
	 * 取消捐赠ABook。
	 * @param miser 捐赠者
	 * @param abook 取消捐赠的一本书
	 * @return 取消捐赠成功或失败。true：取消成功；false：取消失败。
	 * @throws AuthorizationExeption 授权失败异常，可能的原因是此书不是此用户登记的。
	 * @throws ABookStateException 本书状态异常。可能的原始是此书还未被捐赠。
	 */
	public boolean cancelDona(Miser miser, ABook abook) throws AuthorizationExeption, ABookStateException;
	
	/**
	 * 申请咪ABook（一本指定的实体书）。这个申请将被传递到ABook当前的持有者（holder），由holder来决定是否同意或拒绝。
	 * @param miser 申请者
	 * @param abook 申请的ABook
	 * @return applySequnceCode 此申请的确认号码，表示此申请进入等待holder回答状态。
	 * @throws AuthorizationExeption 授权失败异常，可能的原因是holder不能申请自己当前持有的书。
	 */
	public String applyM1ABook(Miser miser, ABook abook) throws AuthorizationExeption;
	
	/**
	 * ABook的holder回应申请。
	 * @param holder ABook的当前持有者
	 * @param abook 目标ABook
	 * @param applySequnceCode 申请的确认号码
	 * @param anwser holder的决定
	 * @throws AuthorizationExeption 授权失败异常，可能的原因是holder并不是此ABook的当前持有者。
	 */
	public void anwserApplyM1ABook(Miser holder, ABook abook, String applySequnceCode, int anwser) throws AuthorizationExeption;
	
	
	/**
	 * ABook的咪书者Miser确认收到ABook。一旦确认，此书的当前持有者也就是holder变成此咪书者Miser。
	 * @param miser 咪书者
	 * @param abook 被传递的ABook
	 * @param applySequenceCode 此次申请的序列号
	 * @param state 确认信息备注
	 * @throws AuthorizationExeption 授权失败异常，可能的原因是Miser并不是此ABook的真正申请者。
	 */
	public void confirmM1ABook(Miser miser, ABook abook, String applySequenceCode, String message) throws AuthorizationExeption;
	
	/**
	 * 根据ISBN号码从本地查找Book。
	 * @param isbn 书籍的ISBN号码
	 * @return Book: 查找出来的书籍对象。
	 * @throws BookNotExistException
	 */
	public Book searchBookByISBNFromLocal(String isbn) throws BookNotExistException;
	
	/**
	 * 根据ISBN号码从豆瓣查找Book。
	 * @param isbn 书籍的ISBN号码
	 * @return Book: 查找出来的书籍对象。
	 * @throws BookNotExistException
	 */
	public Book searchBookByISBNFromDouban(String isbn) throws BookNotExistException;
	
}
